#ifndef FPLAYER_IDECODER_H
#define FPLAYER_IDECODER_H

#include "FFMpegHeader.h"
#include "MediaDefine.h"

//枚举 解码器状态
enum DecoderState {
  DecoderState_None = 0,
  DecoderState_Init,      //初始化完成状态
  DecoderState_Release,   //释放完状态
  DecoderState_Decode,    //解码状态
};

//结构体 解码器参数
typedef struct ST_DecodeParam : public IBasic {
  AVStream *pStream = nullptr;

  const char *getClassName() override {
    return "DecoderParam";
  }

  void toString() override {
  }

} DecoderParam;

class IDecoder;

//类 解码后数据回调
class IDecodeCallback {
public:
  IDecodeCallback() = default;

  virtual ~IDecodeCallback() = default;

  /**
   * 解码完后的数据回调
   * @param pDecoder 解码器
   * @param pFrame 解码完的一帧数据
   */
  virtual void onDecodeData(IDecoder *pDecoder, AVFrame *pFrame) = 0;
};

//类 定义解码器
class IDecoder : public IBasic {
protected:
  //解码回调函数
  IDecodeCallback *_pDecoderCallback = nullptr;

  DecoderState _State = DecoderState_None;
public:
  explicit IDecoder(IDecodeCallback *pDecoderCallback)
      : IBasic(), _pDecoderCallback(pDecoderCallback) {

  }

  virtual ~IDecoder() = default;

  /**
   * 初始化解码器
   * @param decodeParam 解码器参数
   * @return true is Success
   */
  virtual bool initDecoder(DecoderParam &decodeParam) = 0;

  /**
   * 释放解码器
   */
  virtual void releaseDecoder() = 0;

  /**
   * 开始解码
   * @param pPacket 待解码的数据包
   */
  virtual bool startDecode(AVPacket *pPacket) = 0;

  /**
   * 解码的媒体类型
   * @return 媒体类型
   */
  virtual MediaType getMediaType() = 0;
};

#endif //FPLAYER_IDECODER_H
